import fs from 'fs'
import path from 'path';

interface RemoveFileConfig {
    filePath?: string
    callback?: Function
}

/**
 * 文件遍历方法
 * @param config
 * @param config.filePath 需要遍历的文件路径
 * @param config.callback 遍历后的回调函数
 * @returns
 */
function fileDisplay(config: RemoveFileConfig | undefined) {
    const { filePath = path.join(process.cwd(), 'src'), callback } = config || {}
    // 根据文件路径读取文件，返回文件列表
    fs.readdir(filePath, function (err, files) {
        if (err) {
            console.warn(err)
        } else {
            // 遍历读取到的文件列表
            files.forEach(function (filename) {
                // 获取当前文件的绝对路径
                var filedir = path.join(filePath, filename);
                // 根据文件路径获取文件信息，返回一个fs.Stats对象
                fs.stat(filedir, function (eror, stats) {
                    if (eror) {
                        console.warn('获取文件stats失败');
                    } else {
                        var isFile = stats.isFile(); // 是文件
                        var isDir = stats.isDirectory(); // 是文件夹
                        if (isFile) {
                            if (callback) {
                                // 如果有自定义回调函数，就调用
                                callback?.(filename);
                            } else if (filename.endsWith('.js') || filename.endsWith('.map')) {
                                // 如果后缀为.js或.map，就删除掉
                                fs.unlinkSync(filedir);
                            }
                        }
                        if (isDir) {
                            fileDisplay({ filePath: filedir, callback }); // 递归，如果是文件夹，就继续遍历该文件夹下面的文件
                        }
                    }
                })
            });
        }
    });
}

// 自定义插件来解决打包后src目录中自动生成的.js和.map文件问题
export default (config?: RemoveFileConfig) => {
  return {
    name: 'removeFiles',
    // 在打包完成后执行
    writeBundle() {
        fileDisplay(config)
    }
  }
}